package pe.gob.servir.apps.censodirectivo.ejb.service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import org.apache.log4j.Logger;
import org.jboss.ejb3.annotation.Clustered;

import pe.gob.servir.apps.censodirectivo.common.constantes.Constantes;
import pe.gob.servir.apps.censodirectivo.common.util.Utilitario;
import pe.gob.servir.apps.censodirectivo.ejb.dao.ConsumirProcedimientoDAOLocal;
import pe.gob.servir.apps.censodirectivo.ejb.dao.UsuarioDAOLocal;
import pe.gob.servir.apps.censodirectivo.excepcion.DAOExcepcion;
import pe.gob.servir.apps.censodirectivo.excepcion.ServiceExcepcion;
import pe.gob.servir.apps.censodirectivo.model.bean.MensajeRespuesta;
import pe.gob.servir.apps.censodirectivo.model.bean.OpcionUsuario;
import pe.gob.servir.apps.censodirectivo.model.bean.Usuario;
import pe.gob.servir.apps.censodirectivo.persistence.entity.TblUsuario;

/**
 * Session Bean implementation class UsuarioService
 */
@Stateless
@Clustered
public class UsuarioService implements UsuarioServiceRemote,
		UsuarioServiceLocal {

	private static final Logger log = Logger.getLogger(UsuarioService.class);

	@EJB
	private UsuarioDAOLocal usuarioDAOLocal;

	@EJB
	private ConsumirProcedimientoDAOLocal consumirProcedimientoDAOLocal;

	public UsuarioService() {

	}	

	@Override
	public boolean actualizar(Usuario usuario) {
		try {
			TblUsuario tblUsuario = usuarioDAOLocal.buscarPorId(usuario.getUsuarioId());
			tblUsuario.setUsuario(usuario.getUsuario());
			tblUsuario.setClave(usuario.getClave());
			tblUsuario.setPrimeraVez(usuario.getPrimeraVez());
			tblUsuario.setPersonaId(BigDecimal.valueOf(Long.valueOf(usuario.getPersonaId())));
			tblUsuario.setFechaCreacion(Utilitario.convertStringToDate(usuario.getFechaCreacion(), Constantes.FORMATO_FECHA_HORA));
			tblUsuario.setUsuarioCreador(usuario.getUsuarioCreador());
			tblUsuario.setFechaModificacion(Utilitario.convertStringToDate(usuario.getFechaModificacion(), Constantes.FORMATO_FECHA_HORA));
			tblUsuario.setUsuarioModificador(usuario.getUsuarioModificador());
			tblUsuario.setEstadoRegistro(usuario.getEstadoRegistro());
			usuarioDAOLocal.actualizar(tblUsuario);
			return true;
		} catch (Exception e) {
			return false;
		}
	}

	@Override
	public MensajeRespuesta eliminarUsuario(Usuario usuario) throws ServiceExcepcion {
		MensajeRespuesta mensajeRespuesta = null;
		try {
			mensajeRespuesta = usuarioDAOLocal.eliminarUsuario(usuario.getUsuarioId(),usuario.getUsuarioModificador());
		} catch(DAOExcepcion dEx) {
			log.error("ERROR: DAOExcepcion " + dEx);
			mensajeRespuesta = new MensajeRespuesta(dEx.getCodigoError(), dEx.getMensajeError());
		} catch (Exception e) {
			log.error("ERROR: ServiceExcepcion " + e);
			throw new ServiceExcepcion(Constantes.CODIGO_MSJ_ERROR_NEGOCIO, obtenerMensajeError(Constantes.CODIGO_MSJ_ERROR_NEGOCIO));
		}
		return mensajeRespuesta;
	}

	@Override
	public List<Usuario> listarTodos() {
		log.debug("UsuarioService");
		List<TblUsuario> listaUsuarios = usuarioDAOLocal.listarTodos();

		List<Usuario> listaUsuariosBean = new ArrayList<Usuario>();
		for (TblUsuario tblUsuario : listaUsuarios) {
			Usuario usuario = new Usuario();
			usuario.setFechaCreacion(String.valueOf(tblUsuario.getFechaCreacion()));
			usuario.setUsuario(tblUsuario.getUsuario());
			listaUsuariosBean.add(usuario);
		}

		return listaUsuariosBean;
	}

	@Override
	public void actualizarClave(String usuario, String nuevaClave)
			throws ServiceExcepcion {
		log.info("UsuarioService Datos Entrada: " + usuario + "  -  "
				+ nuevaClave);
		try {
			usuarioDAOLocal.actualizarClave(usuario, nuevaClave);
		} catch (DAOExcepcion e) {

		}
	}

	@Override
	public List<Usuario> validarUsuario(String usuario) throws ServiceExcepcion {
		List<Usuario> listaUsuarios = null;
		try {
			listaUsuarios =  usuarioDAOLocal.validarUsuario(usuario);
		} catch (DAOExcepcion e) {
			throw new ServiceExcepcion(e.getCodigoError(), e.getMensajeError());
		} catch (Exception e) {
			log.error("ERROR: ServiceExcepcion " , e);
			throw new ServiceExcepcion(Constantes.CODIGO_MSJ_ERROR_NEGOCIO, obtenerMensajeError(Constantes.CODIGO_MSJ_ERROR_NEGOCIO));
		}
		return listaUsuarios;
	}

	@Override
	public List<OpcionUsuario> listaOpcionesUsuario(String usuario) throws ServiceExcepcion {
		List<OpcionUsuario> listaOpcionUsuarios = null;
		try {
			listaOpcionUsuarios = usuarioDAOLocal.listaOpcionesUsuario(usuario);
		} catch (DAOExcepcion e) {
			throw new ServiceExcepcion(e.getCodigoError(), e.getMensajeError());
		} catch (Exception e) {
			log.error("ERROR: ServiceExcepcion " , e);
			throw new ServiceExcepcion(Constantes.CODIGO_MSJ_ERROR_NEGOCIO, obtenerMensajeError(Constantes.CODIGO_MSJ_ERROR_NEGOCIO));
		}
		return listaOpcionUsuarios;
	}

	@Override
	public List<Usuario> filtrarListaUsuarios(String dni, String usuario,
			String apellidoPaterno, String apellidoMaterno, String nombres,
			String entidad, String perfil, String estado) throws ServiceExcepcion {
		log.info("filtrarListaUsuarios: " );
		List<Usuario> listaUsuarios = null;
		try {
			 listaUsuarios = usuarioDAOLocal.filtrarListaUsuarios(dni, usuario, apellidoPaterno, apellidoMaterno, nombres, entidad, perfil, estado);
		} catch (DAOExcepcion e) {
			throw new ServiceExcepcion(e.getCodigoError(), e.getMensajeError());
		} catch (Exception e) {
			log.error("ERROR: ServiceExcepcion " , e);
			throw new ServiceExcepcion(Constantes.CODIGO_MSJ_ERROR_NEGOCIO, obtenerMensajeError(Constantes.CODIGO_MSJ_ERROR_NEGOCIO));
		}
		
		return listaUsuarios;
	}

	@Override
	public MensajeRespuesta registrarUsuario(Usuario usuario) throws ServiceExcepcion {
		log.info("EJB UsuarioService - registrarUsuario");
		MensajeRespuesta mensajeRespuesta = null;
		
		try {
			mensajeRespuesta = usuarioDAOLocal.insertarUsuario(usuario.getUsuarioId(), usuario.getUsuario(),
					usuario.getPersonaId(), usuario.getPerfilId(), usuario.getUsuarioCreador(),
					usuario.getEstadoRegistro(), usuario.getClave(), usuario.getEmail());
		} catch(DAOExcepcion dEx) {
			log.error("ERROR: DAOExcepcion " , dEx);
			mensajeRespuesta = new MensajeRespuesta(dEx.getCodigoError(), dEx.getMensajeError());
		} catch (Exception e) {
			log.error("ERROR: ServiceExcepcion " , e);
			throw new ServiceExcepcion(Constantes.CODIGO_MSJ_ERROR_NEGOCIO, obtenerMensajeError(Constantes.CODIGO_MSJ_ERROR_NEGOCIO));
		}

		return mensajeRespuesta;
	}
	
	private String obtenerMensajeError(final String codigo){
		 String mensajeError = consumirProcedimientoDAOLocal.consultarMensaje(codigo);
		return mensajeError;
	}

	@Override
	public Usuario obtenerUsuarioPorId(long usuarioId) throws ServiceExcepcion {
		Usuario usuario = null;
		try {
			usuario = usuarioDAOLocal.obtenerUsuarioPorId(usuarioId);
		} catch (DAOExcepcion e) {
			throw new ServiceExcepcion(e.getCodigoError(), e.getMensajeError());
		} catch (Exception e) {
			log.error("ERROR: ServiceExcepcion " , e);
			throw new ServiceExcepcion(Constantes.CODIGO_MSJ_ERROR_NEGOCIO, obtenerMensajeError(Constantes.CODIGO_MSJ_ERROR_NEGOCIO));
		} finally {
//			log.info("Fin del metodo [obtenerDatosPersona]");
		}
		return usuario;
	}
	
	@Override
	public Usuario obtenerUsuarioPorEmail(String email) throws ServiceExcepcion {
		Usuario usuario = null;
		try {
			usuario = usuarioDAOLocal.obtenerUsuarioPorEmail(email);
		} catch (DAOExcepcion e) {
			throw new ServiceExcepcion(e.getCodigoError(), e.getMensajeError());
		} catch (Exception e) {
			log.error("ERROR: ServiceExcepcion " , e);
			throw new ServiceExcepcion(Constantes.CODIGO_MSJ_ERROR_NEGOCIO, obtenerMensajeError(Constantes.CODIGO_MSJ_ERROR_NEGOCIO));
		} finally {
//			log.info("Fin del metodo [obtenerDatosPersona]");
		}
		return usuario;
	}
	
	@Override
	public Usuario obtenerUsuarioPorLogin(String sUsuario) throws ServiceExcepcion {
		Usuario usuario = null;
		try {
			usuario = usuarioDAOLocal.obtenerUsuarioPorLogin(sUsuario);
		} catch (DAOExcepcion e) {
			throw new ServiceExcepcion(e.getCodigoError(), e.getMensajeError());
		} catch (Exception e) {
			log.error("ERROR: ServiceExcepcion " , e);
			throw new ServiceExcepcion(Constantes.CODIGO_MSJ_ERROR_NEGOCIO, obtenerMensajeError(Constantes.CODIGO_MSJ_ERROR_NEGOCIO));
		} finally {
//			log.info("Fin del metodo [obtenerDatosPersona]");
		}
		return usuario;
	}
	
	@Override
	public Usuario obtenerUsuarioPorPersonaId(long personaId) throws ServiceExcepcion {
		Usuario usuario = null;
		try {
			usuario = usuarioDAOLocal.obtenerUsuarioPorPersonaId(personaId);
		} catch (DAOExcepcion e) {
			throw new ServiceExcepcion(e.getCodigoError(), e.getMensajeError());
		} catch (Exception e) {
			log.error("ERROR: ServiceExcepcion " , e);
			throw new ServiceExcepcion(Constantes.CODIGO_MSJ_ERROR_NEGOCIO, obtenerMensajeError(Constantes.CODIGO_MSJ_ERROR_NEGOCIO));
		} finally {
//			log.info("Fin del metodo [obtenerDatosPersona]");
		}
		return usuario;
	}
	
	@Override
	public Usuario obtenerUsuarioPorDocumento(String nroDocumento) throws ServiceExcepcion {
		Usuario usuario = null;
		try {
			usuario = usuarioDAOLocal.obtenerUsuarioPorDocumento(nroDocumento);
		} catch (DAOExcepcion e) {
			throw new ServiceExcepcion(e.getCodigoError(), e.getMensajeError());
		} catch (Exception e) {
			log.error("ERROR: ServiceExcepcion " , e);
			throw new ServiceExcepcion(Constantes.CODIGO_MSJ_ERROR_NEGOCIO, obtenerMensajeError(Constantes.CODIGO_MSJ_ERROR_NEGOCIO));
		} finally {
//			log.info("Fin del metodo [obtenerDatosPersona]");
		}
		return usuario;
	}
	
}
